package mx.ipn.escom.redes.gestionardocumentos.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import mx.ipn.escom.redes.equipo.model.Documento;
import mx.ipn.escom.redes.gestionardocumentos.business.DocumentoBs;
import mx.ipn.escom.redes.util.Constantes;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.validator.annotations.ConversionErrorFieldValidator;
import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;

@Results({ @Result(name = "equipo", type = "redirectAction", params = {
		"actionName", "gestionar-equipo/new", "namespace", "/equipo" }) })
@Namespace("/documento")
public class GestionarDocumentosCtrl extends ActionSupport implements
		ModelDriven<Documento> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Integer idSel;

	private Documento model;

	private List<Documento> listDocumento;

	private DocumentoBs documentoBs;

	private String nombre;

	/**
	 * Carga los datos de la documentacion y muestra la pantalla de gestionar
	 * documentacion
	 * 
	 * @return
	 */
	public String index() {
		listDocumento = documentoBs.findAll();
		if (listDocumento == null || listDocumento.isEmpty()) {
			addActionMessage(getText("SIN_REGISTROS_DOCUMENTO"));
		}
		return "index";
	}

	/**
	 * Regresa la vista para crear un nuevo documento
	 * 
	 * @return
	 */
	public String editNew() {
		HttpServletRequest request = ServletActionContext.getRequest();
		String isCreatingEquipo = request.getParameter("isCreatingEquipo");
		if (isCreatingEquipo != null)
			Constantes.isCreatingEquipo = Boolean
					.parseBoolean(isCreatingEquipo);
		else
			Constantes.isCreatingEquipo = false;
		return "editNew";
	}

	/**
	 * Hace uso del negocio y permite registrar una nueva documenacion
	 * 
	 * @return
	 */
	@Validations(requiredStrings = {
			@RequiredStringValidator(fieldName = "model.nombre", type = ValidatorType.FIELD, key = "DOCUMENTO_NOMBRE_REQUERIDO"),
			@RequiredStringValidator(fieldName = "model.autor", type = ValidatorType.FIELD, key = "DOCUMENTO_AUTOR_REQUERIDO") }, requiredFields = { @RequiredFieldValidator(fieldName = "model.version", type = ValidatorType.SIMPLE, key = "DOCUMENTO_VERSION_REQUERIDO") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "model.edicion", type = ValidatorType.FIELD, min = "0", key = "DOCUMENTO_EDICION_REQUERIDO") }, conversionErrorFields = {
			@ConversionErrorFieldValidator(fieldName = "model.version", shortCircuit = true, key = "DOCUMENTO_VERSION_FORMATO", type = ValidatorType.SIMPLE),
			@ConversionErrorFieldValidator(fieldName = "model.edicion", shortCircuit = true, key = "DOCUMENTO_EDICION_FORMATO", type = ValidatorType.SIMPLE) })
	public String create() {
		if (!documentoBs.validarNombre(model.getNombre())) {
			addActionMessage(getText("DOCUMENTO_REPETIDO"));
		} else {
			documentoBs.guardar(model);
			addActionMessage(getText("REGISTRO_DOCUMENTACION_EXITOSO"));
		}
		if (Constantes.isCreatingEquipo)
			return "equipo";
		else
			return index();
	}

	/**
	 * Regresa la vista para editar un documento
	 * 
	 * @return
	 */
	public String edit() {
		return "edit";
	}

	/**
	 * Hace uso del negocio y permite modificar una documentacion
	 */
	@Validations(requiredStrings = {
			@RequiredStringValidator(fieldName = "model.nombre", type = ValidatorType.FIELD, key = "DOCUMENTO_NOMBRE_REQUERIDO"),
			@RequiredStringValidator(fieldName = "model.autor", type = ValidatorType.FIELD, key = "DOCUMENTO_AUTOR_REQUERIDO") }, requiredFields = { @RequiredFieldValidator(fieldName = "model.version", type = ValidatorType.SIMPLE, key = "DOCUMENTO_VERSION_REQUERIDO") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "model.edicion", type = ValidatorType.FIELD, min = "0", key = "DOCUMENTO_EDICION_REQUERIDO") })
	public String update() {
		if (!model.getNombre().equals(getNombre())) {
			if (!documentoBs.validarNombre(model.getNombre())) {
				addActionMessage(getText("APLICACION_REPETIDA"));
			} else {
				documentoBs.actualizar(model);
				addActionMessage(getText("MODIFICACION_APLICACION_EXITOSO"));
			}
		} else {
			documentoBs.actualizar(model);
			addActionMessage(getText("MODIFICACION_DOCUMENTACION_EXITOSA"));
		}

		return index();
	}

	/**
	 * Regresa la vista de confirmación para eliminar documento
	 * 
	 * @return
	 */
	public String deleteConfirm() {
		return "deleteConfirm";
	}

	/**
	 * Hace uso del negocio y permite eliminar una documentacion
	 */
	public String destroy() {
		documentoBs.eliminar(model);
		addActionMessage(getText("ELIMINACION_DOCUMENTACION_EXITOSA"));
		return index();
	}

	/**
	 * @return the idSel
	 */
	public Integer getIdSel() {
		return idSel;
	}

	/**
	 * @param idSel
	 *            the idSel to set
	 */
	public void setIdSel(Integer idSel) {
		this.idSel = idSel;
		if (idSel != null) {
			model = documentoBs.findById(idSel);
		}
		if (model.getNombre() != null) {
			setNombre(model.getNombre());
		} else {
			setNombre("");
		}
	}

	/**
	 * @return the model
	 */
	public Documento getModel() {
		if (model == null) {
			model = new Documento();
		}
		return model;
	}

	/**
	 * @param model
	 *            the model to set
	 */
	public void setModel(Documento model) {
		this.model = model;
	}

	/**
	 * @return the listDocumento
	 */
	public List<Documento> getListDocumento() {
		return listDocumento;
	}

	/**
	 * @param listDocumento
	 *            the listDocumento to set
	 */
	public void setListDocumento(List<Documento> listDocumento) {
		this.listDocumento = listDocumento;
	}

	/**
	 * @return the documentoBs
	 */
	public DocumentoBs getDocumentoBs() {
		return documentoBs;
	}

	/**
	 * @param documentoBs
	 *            the documentoBs to set
	 */
	public void setDocumentoBs(DocumentoBs documentoBs) {
		this.documentoBs = documentoBs;
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre
	 *            the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

}
